Connection.load   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
import {AdapterInterface, ModelInterface, ModelStaticInterface, QueueAble} from "../JeloquentInterfaces";
2
3
/**
4
 *
5
 */
6
export default class Connection {
7
8
    private _updateQueue: Array<QueueAble>;
9
10
    private adapter: AdapterInterface;
11
12
    private paused: boolean;
13
14
    constructor(adapter:AdapterInterface) {
15
        this.adapter = adapter;
16
        this._updateQueue = [];
17
        this.paused = false;
18
    }
19
20
    all(model: ModelStaticInterface): Promise<unknown> {
21
        return new Promise((resolve) => {
22
            this.adapter.all(model)
23
                .then((queueMessage) => {
24
                    this.handleQueueMessage(queueMessage, resolve);
25
                });
26
        });
27
    }
28
29
    delete(model: ModelInterface): Promise<unknown> {
30
        return new Promise((resolve) => {
31
            this.adapter.delete(model)
32
                .then((queueMessage) => {
33
                    this.handleQueueMessage(queueMessage, resolve);
34
                });
35
        });
36
    }
37
38
    /**
39
     * @deprecated
40
     */
41
    load(model: ModelStaticInterface): Promise<unknown> {
42
        return this.all(model)
43
    }
44
45
    patch(model: ModelInterface): Promise<unknown> {
46
        return new Promise((resolve) => {
47
            this.adapter.patch(model)
48
                .then((queueMessage) => {
49
                    this.handleQueueMessage(queueMessage, resolve);
50
                });
51
        });
52
    }
53
54
    pause(): void {
55
        this.paused = true;
56
    }
57
58
    post(model: ModelInterface): Promise<unknown> {
59
        return new Promise((resolve) => {
60
            this.adapter.post(model)
61
                .then((queueMessage) => {
62
                    this.handleQueueMessage(queueMessage, resolve);
63
                });
64
        });
65
    }
66
67
    put(model): Promise<unknown> {
68
        return new Promise((resolve) => {
69
            this.adapter.put(model)
70
                .then((queueMessage) => {
71
                    this.handleQueueMessage(queueMessage, resolve);
72
                });
73
        });
74
    }
75
76
    resume(): void {
77
        this.paused = false;
78
    }
79
80
    private addToQueue(...queueMessage: Array<QueueAble>): void {
81
        this._updateQueue.push(...queueMessage);
82
    }
83
84
    private handleQueueMessage(queueMessage: QueueAble, resolve: CallableFunction): void {
85
        queueMessage.addCallback(resolve);
86
        this.addToQueue(queueMessage);
87
        queueMicrotask(() => {
88
            this.processQueue();
89
        });
90
    }
91
92
    private processQueue(): void {
93
        const nextMessage = (this._updateQueue ?? []).shift();
94
        if (!nextMessage) {
95
            return;
96
        }
97
        nextMessage.execute();
98
        queueMicrotask(() => {
99
            this.processQueue();
100
        });
101
    }
102
}